package org.pictual.controller;

import java.util.Vector;

import org.apache.log4j.Logger;
import org.pictual.business.vo.DefinicionVO;
import org.pictual.business.vo.IdiomaVO;
import org.pictual.business.vo.ImagenVO;
import org.pictual.business.vo.PalabraVO;
import org.pictual.service.DefinicionDelegateImpl;
import org.pictual.service.IdiomaDelegateImpl;
import org.pictual.service.ImagenDelegateImpl;
import org.pictual.service.PalabraDelegateImpl;
import org.pictual.service.PictualDelegateFactory;

public class Controlador {

	private String query;
	private String idioma_origen;
	private String idioma_destino;
	private IdiomaVO idiomaVO;
	private DefinicionVO definicionVO;
	private PalabraVO palabraVO;
	private ImagenVO[] imagenes = new ImagenVO[6];
	private String cadena_wiki;
//	private SequenceGeneratorDAO sequenceGeneratorDAO;
	private static String ruta;
	
	protected static Logger log= Logger.getLogger(Controlador.class);
	
	public Controlador(String query, String idioma_origen,
			String idioma_destino, String ruta) {
		this.query = query;
		this.idioma_origen = idioma_origen;
		this.idioma_destino = idioma_destino;
		Controlador.setRuta(ruta);
	}
	
	public int checkDataSource(){
		boolean ofdatabase = fillTheVOifExistInDatabase();
		if(!ofdatabase){
			log.info("La palabra "+query +" no esta en la BBDD. Busco en wiki");
			cadena_wiki=WikiObtieneDatos.getData(query, idioma_destino);
			if(cadena_wiki.isEmpty()){
				log.error("La palabra no esta en la wiki seleccionada");
				return -1;
			}
			WikiTrataDatos wtd = new WikiTrataDatos(query, cadena_wiki, idioma_destino, idioma_origen);
			log.info("Los datos han sido obtenidos de wiki");
			idiomaVO = wtd.getIdiomaVO();
			definicionVO = wtd.getDefinicionVO();
			palabraVO = wtd.getPalabraVO();
//			imagenes = wtd.getImagenes();
			log.info("Los datos están en los VO");
			return 0;
		}
		return 1;
	}
	
	public boolean fillTheVOifExistInDatabase(){
		//TODO 1 idioma por palabra (se mejora)
		//TODO 4 definiciones por palabra (si ya esta se muestra)
		//TODO Si no hay idioma, no hay palabra
		
		//En la tabla definicion habria hasta 16 veces cada palabra. una por cada wiki (destino) x hasta 4 veces de origen
		//en la tabla idioma habria hasta 4 veces la palabra 
		
		IdiomaVO origen = new IdiomaVO();
		origen.setIdioma(idioma_origen);
		
		IdiomaVO destino = new IdiomaVO();
		destino.setIdioma(idioma_destino);
		
		idiomaVO = PictualDelegateFactory.getIdiomaDelegate().readIdioma(query, origen.getIdioma());
		if(idiomaVO==null) return false;
		definicionVO = PictualDelegateFactory.getDefinicionDelegate().readDefinicion(idiomaVO.getPalabra_id(), idiomaVO.getIdioma(), destino.getIdioma());
		if(definicionVO==null) return false;
		log.info("ID: de la palabra"+definicionVO.getPalabra_id()+" ."+idiomaVO.getPalabra_id());
		palabraVO = PictualDelegateFactory.getPalabraDelegate().readPalabra(definicionVO.getPalabra_id());
		imagenes[0] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_1());
		imagenes[1] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_2());
		imagenes[2] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_3());
		imagenes[3] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_4());
		imagenes[4] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_5());
		imagenes[5] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_6());
		
		if((idiomaVO!=null)&&(definicionVO!=null)) return true;
		
		
//		if(idiomaVO!=null){
//			//La palabra esta en la base de datos, la buscamos en la wiki elegida.
//			definicionVO = PictualDelegateFactory.getDefinicionDelegate().readDefinicion(idiomaVO.getPalabra_id(), idiomaVO.getIdioma(), destino.getIdioma());
//			if(definicionVO!=null){
//				//    			Con el  id_palabra busco en la base de datos en la tabla Palabra y guardo los datos en la clase PalabraVO
//				palabraVO = PictualDelegateFactory.getPalabraDelegate().readPalabra(definicionVO.getPalabra_id());
//				//    			Con los datos de cada id_imagen almacenados en PalabraVO voy haciendo una búsqueda para cada una en la base de datos en la tabla Imagen obteniendo los datos y almacenándolos en 6 objetos ImagenVO.
//				imagenes[0] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_1());
//				imagenes[1] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_2());
//				imagenes[2] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_3());
//				imagenes[3] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_4());
//				imagenes[4] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_5());
//				imagenes[5] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_6());
//
//				log.info("Los datos se han obtenido de la base de datos de Pictual");
//				return true;
//			}else{
//				//TODO hay idioma pero no definicion, por lo tanto tengo que obtener de wiki la definicion y demas. y si puedo mejorar el idioma
//			}
//		}
		//    	Si no devuelve resultados, la palabra no esta en nuestra base de datos:
		
		return false;
	}
	
	public Vector<MyImage> findImages(int n){
		Vector<MyImage> images = null;
		log.info("Pasa por findimages");
		if(n==0){
			log.info("Es 0 se descargaran las imagenes");
			images = GoogleSearchImg.queryForImages(query, idioma_origen);
			int i=0;
			for(MyImage img: images){
				log.info("imagen encontrada");
				imagenes[i]=new ImagenVO();
				imagenes[i].setHeight(img.getHeight());
				imagenes[i].setWidth(img.getWidth());
				imagenes[i].setPath_big(img.getImgRef());
				imagenes[i].setPath_small(img.getImgLink());
				log.info(i+": "+imagenes[i].getPath_big());
				i++;
			}
		}
		if(n==1){	//las coge de base de datos
			images = DatabaseImg.getVectorImages(imagenes);
		}
		return images;
	}
	
	public void insertInDataBase(){
		for(ImagenVO img: imagenes){
			if(img!=null)ImagenDelegateImpl.getInstance().insertImagen(img);
		}
		if(imagenes[0]!=null) palabraVO.setImagen_1(imagenes[0].getImagen_id());
		if(imagenes[1]!=null) palabraVO.setImagen_2(imagenes[1].getImagen_id());
		if(imagenes[2]!=null) palabraVO.setImagen_3(imagenes[2].getImagen_id());
		if(imagenes[3]!=null) palabraVO.setImagen_4(imagenes[3].getImagen_id());
		if(imagenes[4]!=null) palabraVO.setImagen_5(imagenes[4].getImagen_id());
		if(imagenes[5]!=null) palabraVO.setImagen_6(imagenes[5].getImagen_id());
		
//		System.out.println(palabraVO);
//		System.out.println(definicionVO);
//		System.out.println(idiomaVO);
		
		int palabra_id=PalabraDelegateImpl.getInstance().insertPalabra(palabraVO);
		definicionVO.setPalabra_id(palabra_id);
		idiomaVO.setPalabra_id(palabra_id);
		IdiomaDelegateImpl.getInstance().insertIdioma(idiomaVO);
		DefinicionDelegateImpl.getInstance().insertDefinicion(definicionVO);
	}
	public IdiomaVO getIdiomaVO() {
		return idiomaVO;
	}

	public void setIdiomaVO(IdiomaVO idiomaVO) {
		this.idiomaVO = idiomaVO;
	}
	
	public DefinicionVO getDefinicionVO() {
		return definicionVO;
	}

	public PalabraVO getPalabraVO() {
		return palabraVO;
	}

	public ImagenVO[] getImagenes() {
		return imagenes;
	}

	public static String getRuta() {
		return ruta;
	}

	public static void setRuta(String ruta) {
		Controlador.ruta = ruta;
	}
	
	
}
